package com.navinfo.platform.basicdatastatistics.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.navinfo.location.mileage.util.JsonUtil;
import com.navinfo.platform.basicdatastatistics.dto.*;
import com.navinfo.platform.basicdatastatistics.service.IDataStatisticsService;
import com.navinfo.platform.common.utils.DataUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import scala.collection.mutable.WrappedArray;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;

public abstract class DefaultDataStatisticsService implements IDataStatisticsService {
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultDataStatisticsService.class);

    @Override
    public StructType createSchema() {
        List<StructField> list=new ArrayList<>();
        list.add(new StructField("uid", DataTypes.LongType, true, Metadata.empty()));
        list.add(new StructField("tid", DataTypes.LongType, true, Metadata.empty()));
        list.add(new StructField("sharp_step_on_gas_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("trip_power", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("trip_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("trip_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("trip_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_useful_speed", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_useful_speed", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("in_gear_coast_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("in_gear_coast_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("in_gear_coast_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("brake_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("brake_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("brake_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_estimated_load", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("route_integral_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("route_integral_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_speed", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_speed", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("parking_power_on_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("city_driving_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("city_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("city_driving_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rural_driving_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rural_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rural_driving_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("eco_driving_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("eco_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("eco_driving_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("up_slope_driving_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("up_slope_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("up_slope_driving_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("down_slope_driving_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("down_slope_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("down_slope_driving_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("level_road_driving_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("level_road_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("level_road_driving_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_cold_start_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_cold_start_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_cold_start_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("cruise_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("cruise_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("cruise_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("shift_gears_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_down_speed_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_down_speed_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_down_speed_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_up_speed_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_up_speed_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_up_speed_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_up_speed_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_step_on_gas_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_step_on_gas_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_step_on_gas_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_park_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_start_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_cold_start_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("charge_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("leak_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_start_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("vehicle_start_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_stability_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_stability_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("cross_cities", DataTypes.StringType, true, Metadata.empty()));
        list.add(new StructField("avg_speed", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("exceed_speed_range_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("exceed_speed_range_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("exceed_speed_range_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("assist_brake_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("assist_brake_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("fatigue_driving_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("park_throttle_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("park_throttle_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("engine_work_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("driving_handbrake_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("driving_handbrake_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("driving_handbrake_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_handbrake_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_handbrake_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sharp_turning_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range01_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range01_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range01_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range02_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range02_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range02_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range03_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range03_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range03_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range04_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range04_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range04_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range05_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range05_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range05_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range06_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range06_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range06_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range07_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range07_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range07_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range08_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range08_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range08_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range09_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range09_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range09_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range10_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range10_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range10_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range11_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range11_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range11_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range12_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range12_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("speed_range12_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear01_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear01_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear01_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear01_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear02_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear02_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear02_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear02_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear03_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear03_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear03_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear03_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear04_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear04_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear04_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear04_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear05_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear05_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear05_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear05_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear06_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear06_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear06_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear06_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear07_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear07_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear07_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear07_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear08_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear08_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear08_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear08_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear09_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear09_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear09_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear09_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear10_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear10_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear10_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear10_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear11_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear11_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear11_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear11_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear12_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear12_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear12_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear12_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear13_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear13_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear13_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear13_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear14_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear14_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear14_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear14_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear15_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear15_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear15_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear15_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear16_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear16_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear16_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear16_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear_other_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear_other_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear_other_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gear_other_number", DataTypes.IntegerType, true, Metadata.empty()));
        List<StructField> structFields = getRpmSchema();
        list.addAll(structFields);
        list.add(new StructField("no_idle_rpm_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("no_idle_rpm_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_rpm", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_rpm", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_rpm", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_no_idle_rpm", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp50_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp70_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp80_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp85_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp95_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp105_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp110_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp115_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp120_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp125_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp130_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp135_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp140_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp145_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp_over150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp50_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp70_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp80_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp85_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp95_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp105_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp110_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp115_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp120_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp125_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp130_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp135_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp140_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp145_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp_over150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_work_water_temp", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_work_water_temp", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("work_water_temp_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_work_water_temp", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_idle_water_temp", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_idle_water_temp", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_water_temp_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_idle_water_temp", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent0_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent10_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent20_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent30_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent40_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent50_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent60_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent70_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent80_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent99_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("gas_open_percent_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_gas_open_percent", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque0_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque10_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque20_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque30_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque40_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque50_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque60_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque70_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque80_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque99_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_torque", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_torque", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("torque_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_torque", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat50_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat70_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat80_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat85_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat95_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat105_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat110_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat115_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat120_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat125_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat130_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat135_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat140_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat145_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat_over150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("iat_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_iat", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_iat", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_iat", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip50_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip60_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip70_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip80_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip110_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip120_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip130_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip140_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip_over150_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip_sum", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ip_count", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("max_ip", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("min_ip", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("avg_ip", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so90_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so90_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so90_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so_90_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so_90_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so_90_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so120_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so120_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so120_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so_120_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so_120_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so_120_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("sr_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("lrog_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("hsb_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("hsb_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("hsb_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("hsb_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("hsb_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("hsb_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("csb_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("csb_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("csb_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("csb_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("csb_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("csb_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("clutch_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("clutch_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("clutch_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("clutch_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("clutch_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("clutch_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_coast_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_coast_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_coast_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_coast_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("ng_mileage_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_number", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("idle_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("fout_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("fout_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("fout_100km_times", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("fout_duration_proportion", DataTypes.IntegerType, true, Metadata.empty()));

        List<StructField> aslStructFields = new ArrayList<>();
        for(int i = 0; i <= 13; i++ ){
            StructField aslTime = DataTypes.createStructField("time", DataTypes.IntegerType, true, Metadata.empty());
            StructField aslMileage = DataTypes.createStructField("mileage", DataTypes.IntegerType, true, Metadata.empty());
            StructField aslFuel = DataTypes.createStructField("fuel", DataTypes.IntegerType, true, Metadata.empty());
            StructType aslInfo = DataTypes.createStructType(new StructField[] { aslTime, aslMileage, aslFuel });
            StructField aslField = DataTypes.createStructField("asl" + i, aslInfo,true, Metadata.empty());
            aslStructFields.add(aslField);
        }

        StructType altitudeInfo = DataTypes.createStructType(aslStructFields);

        StructField altitudeInfoField = DataTypes.createStructField("altitude_info", altitudeInfo,true, Metadata.empty());
        list.add(altitudeInfoField);

        List<StructField> hourStructFields = new ArrayList<>();
        for(int i = 0; i < 24; i++ ){
            StructField hourState = DataTypes.createStructField("state", DataTypes.IntegerType, true, Metadata.empty());
            StructField hourTime = DataTypes.createStructField("time", DataTypes.IntegerType, true, Metadata.empty());
            StructField hourMileage = DataTypes.createStructField("mileage", DataTypes.IntegerType, true, Metadata.empty());
            StructField hourFuel = DataTypes.createStructField("fuel", DataTypes.IntegerType, true, Metadata.empty());
            StructType hour = DataTypes.createStructType(new StructField[] { hourState, hourTime,hourMileage, hourFuel });
            StructField hourField = DataTypes.createStructField("hour" + i + "", hour,true, Metadata.empty());
            hourStructFields.add(hourField);
        }

        StructType vehicleHourInfo = DataTypes.createStructType(hourStructFields);

        StructField vehicleHourInfoField = DataTypes.createStructField("vehicle_hour_info", vehicleHourInfo,true, Metadata.empty());
        list.add(vehicleHourInfoField);
        list.add(new StructField("update_time", DataTypes.TimestampType, true, Metadata.empty()));
        //add row start
        list.add(new StructField("sharp_turning_mil", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so90_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("so120_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("fatigue_driving_duration", DataTypes.IntegerType, true, Metadata.empty()));


        //新增按行程累加的吨/公里字段字段
        list.add(new StructField("ton_km_info", DataTypes.StringType, true, Metadata.empty()));

        //新增按行程累加的经过城市详细信息的字段
        list.add(new StructField("cross_cities_info", DataTypes.StringType, true, Metadata.empty()));

        //新增不同载重类型的里程和油耗信息的字段
        List<StructField> loadInfoFields = new ArrayList<>();
        for(String key: WLoadInfoDto.typeKeys){
            StructField mileageField = DataTypes.createStructField("mileage", DataTypes.IntegerType, true, Metadata.empty());
            StructField fuelField = DataTypes.createStructField("fuel", DataTypes.IntegerType, true, Metadata.empty());
            StructType wloadInfoType= DataTypes.createStructType(new StructField[] { mileageField, fuelField });

            loadInfoFields.add(DataTypes.createStructField(key, wloadInfoType,true, Metadata.empty()));
        }
        list.add(DataTypes.createStructField("wload_type_info", DataTypes.createStructType(loadInfoFields),true, Metadata.empty()));

        //各车厂定制需求
        List<StructField> customSchemas = getCustomSchemas();
        list.addAll(customSchemas);
        return new StructType(list.toArray(new StructField[list.size()]));
    }

    public abstract List<StructField> getCustomSchemas();

    public abstract List<Object> getCustomValues(AbstractBasicDataDto abstractBasicDataDto);

    public abstract void setCustomInfo(Row row, AbstractBasicDataDto basicDataDto);

    @Override
    public Row createRow(AbstractBasicDataDto basicDataDto, StructType schema){
        List<Object> list = new ArrayList<>();
        list.add(basicDataDto.getUid());
        list.add(basicDataDto.getTid());
        list.add(getIntValue(basicDataDto.getSharpStepOnGasNumber()));
        list.add(getIntValue(basicDataDto.getTripPower()));
        list.add(getIntValue(basicDataDto.getTripMileage()));
        list.add(getIntValue(basicDataDto.getTripFuel()));
        list.add(getIntValue(basicDataDto.getTripDuration()));
        list.add(getIntValue(basicDataDto.getMaxUsefulSpeed()));
        list.add(getIntValue(basicDataDto.getMinUsefulSpeed()));
        list.add(getIntValue(basicDataDto.getInGearCoastMileage()));
        list.add(getIntValue(basicDataDto.getInGearCoastDuration()));
        list.add(getIntValue(basicDataDto.getInGearCoastNumber()));
        list.add(getIntValue(basicDataDto.getBrakeNumber()));
        list.add(getIntValue(basicDataDto.getBrakeMileage()));
        list.add(getIntValue(basicDataDto.getBrakeDuration()));
        list.add(getIntValue(basicDataDto.getVehicleEstimatedLoad()));
        list.add(getIntValue(basicDataDto.getRouteIntegralMileage()));
        list.add(getIntValue(basicDataDto.getRouteIntegralFuel()));
        list.add(getIntValue(basicDataDto.getMaxSpeed()));
        list.add(getIntValue(basicDataDto.getMinSpeed()));
        list.add(getIntValue(basicDataDto.getParkingPowerOnDuration()));
        list.add(getIntValue(basicDataDto.getCityDrivingMileage()));
        list.add(getIntValue(basicDataDto.getCityDrivingDuration()));
        list.add(getIntValue(basicDataDto.getCityDrivingFuel()));
        list.add(getIntValue(basicDataDto.getRuralDrivingMileage()));
        list.add(getIntValue(basicDataDto.getRuralDrivingDuration()));
        list.add(getIntValue(basicDataDto.getRuralDrivingFuel()));
        list.add(getIntValue(basicDataDto.getEcoDrivingMileage()));
        list.add(getIntValue(basicDataDto.getEcoDrivingDuration()));
        list.add(getIntValue(basicDataDto.getEcoDrivingFuel()));
        list.add(getIntValue(basicDataDto.getUpSlopeDrivingMileage()));
        list.add(getIntValue(basicDataDto.getUpSlopeDrivingDuration()));
        list.add(getIntValue(basicDataDto.getUpSlopeDrivingFuel()));
        list.add(getIntValue(basicDataDto.getDownSlopeDrivingMileage()));
        list.add(getIntValue(basicDataDto.getDownSlopeDrivingDuration()));
        list.add(getIntValue(basicDataDto.getDownSlopeDrivingFuel()));
        list.add(getIntValue(basicDataDto.getLevelRoadDrivingMileage()));
        list.add(getIntValue(basicDataDto.getLevelRoadDrivingDuration()));
        list.add(getIntValue(basicDataDto.getLevelRoadDrivingFuel()));
        list.add(getIntValue(basicDataDto.getVehicleColdStartMileage()));
        list.add(getIntValue(basicDataDto.getVehicleColdStartDuration()));
        list.add(getIntValue(basicDataDto.getVehicleColdStartFuel()));
        list.add(getIntValue(basicDataDto.getCruiseMileage()));
        list.add(getIntValue(basicDataDto.getCruiseDuration()));
        list.add(getIntValue(basicDataDto.getCruiseFuel()));
        list.add(getIntValue(basicDataDto.getShiftGearsNumber()));
        list.add(getIntValue(basicDataDto.getSharpDownSpeedDuration()));
        list.add(getIntValue(basicDataDto.getSharpDownSpeedMileage()));
        list.add(getIntValue(basicDataDto.getSharpDownSpeedNumber()));
        list.add(getIntValue(basicDataDto.getSharpUpSpeedDuration()));
        list.add(getIntValue(basicDataDto.getSharpUpSpeedMileage()));
        list.add(getIntValue(basicDataDto.getSharpUpSpeedNumber()));
        list.add(getIntValue(basicDataDto.getSharpUpSpeedFuel()));
        list.add(getIntValue(basicDataDto.getSharpStepOnGasMileage()));
        list.add(getIntValue(basicDataDto.getSharpStepOnGasDuration()));
        list.add(getIntValue(basicDataDto.getSharpStepOnGasFuel()));
        list.add(getIntValue(basicDataDto.getVehicleParkNumber()));
        list.add(getIntValue(basicDataDto.getVehicleStartNumber()));
        list.add(getIntValue(basicDataDto.getVehicleColdStartNumber()));
        list.add(getIntValue(basicDataDto.getChargeFuel()));
        list.add(getIntValue(basicDataDto.getLeakFuel()));
        list.add(getIntValue(basicDataDto.getVehicleStartDuration()));
        list.add(getIntValue(basicDataDto.getVehicleStartFuel()));
        list.add(getIntValue(basicDataDto.getGasStabilityNumber()));
        list.add(getIntValue(basicDataDto.getGasStabilityDuration()));
        list.add(basicDataDto.getCrossCities());
        list.add(getIntValue(basicDataDto.getAvgSpeed()));
        list.add(getIntValue(basicDataDto.getExceedSpeedRangeMileage()));
        list.add(getIntValue(basicDataDto.getExceedSpeedRangeDuration()));
        list.add(getIntValue(basicDataDto.getExceedSpeedRangeFuel()));
        list.add(getIntValue(basicDataDto.getAssistBrakeMileage()));
        list.add(getIntValue(basicDataDto.getAssistBrakeDuration()));
        list.add(getIntValue(basicDataDto.getFatigueDrivingNumber()));
        list.add(getIntValue(basicDataDto.getParkThrottleDuration()));
        list.add(getIntValue(basicDataDto.getParkThrottleFuel()));
        list.add(getIntValue(basicDataDto.getEngineWorkDuration()));
        list.add(getIntValue(basicDataDto.getDrivingHandbrakeNumber()));
        list.add(getIntValue(basicDataDto.getDrivingHandbrakeDuration()));
        list.add(getIntValue(basicDataDto.getDrivingHandbrakeMileage()));
        list.add(getIntValue(basicDataDto.getIdleHandbrakeNumber()));
        list.add(getIntValue(basicDataDto.getIdleHandbrakeDuration()));
        list.add(getIntValue(basicDataDto.getSharpTurningNumber()));
        list.add(getIntValue(basicDataDto.getSpeedRange01Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange01Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange01Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange02Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange02Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange02Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange03Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange03Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange03Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange04Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange04Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange04Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange05Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange05Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange05Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange06Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange06Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange06Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange07Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange07Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange07Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange08Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange08Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange08Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange09Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange09Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange09Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange10Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange10Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange10Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange11Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange11Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange11Fuel()));
        list.add(getIntValue(basicDataDto.getSpeedRange12Mileage()));
        list.add(getIntValue(basicDataDto.getSpeedRange12Duration()));
        list.add(getIntValue(basicDataDto.getSpeedRange12Fuel()));
        list.add(getIntValue(basicDataDto.getGear01Mileage()));
        list.add(getIntValue(basicDataDto.getGear01Fuel()));
        list.add(getIntValue(basicDataDto.getGear01Duration()));
        list.add(getIntValue(basicDataDto.getGear01Number()));
        list.add(getIntValue(basicDataDto.getGear02Mileage()));
        list.add(getIntValue(basicDataDto.getGear02Fuel()));
        list.add(getIntValue(basicDataDto.getGear02Duration()));
        list.add(getIntValue(basicDataDto.getGear02Number()));
        list.add(getIntValue(basicDataDto.getGear03Mileage()));
        list.add(getIntValue(basicDataDto.getGear03Fuel()));
        list.add(getIntValue(basicDataDto.getGear03Duration()));
        list.add(getIntValue(basicDataDto.getGear03Number()));
        list.add(getIntValue(basicDataDto.getGear04Mileage()));
        list.add(getIntValue(basicDataDto.getGear04Fuel()));
        list.add(getIntValue(basicDataDto.getGear04Duration()));
        list.add(getIntValue(basicDataDto.getGear04Number()));
        list.add(getIntValue(basicDataDto.getGear05Mileage()));
        list.add(getIntValue(basicDataDto.getGear05Fuel()));
        list.add(getIntValue(basicDataDto.getGear05Duration()));
        list.add(getIntValue(basicDataDto.getGear05Number()));
        list.add(getIntValue(basicDataDto.getGear06Mileage()));
        list.add(getIntValue(basicDataDto.getGear06Fuel()));
        list.add(getIntValue(basicDataDto.getGear06Duration()));
        list.add(getIntValue(basicDataDto.getGear06Number()));
        list.add(getIntValue(basicDataDto.getGear07Mileage()));
        list.add(getIntValue(basicDataDto.getGear07Fuel()));
        list.add(getIntValue(basicDataDto.getGear07Duration()));
        list.add(getIntValue(basicDataDto.getGear07Number()));
        list.add(getIntValue(basicDataDto.getGear08Mileage()));
        list.add(getIntValue(basicDataDto.getGear08Fuel()));
        list.add(getIntValue(basicDataDto.getGear08Duration()));
        list.add(getIntValue(basicDataDto.getGear08Number()));
        list.add(getIntValue(basicDataDto.getGear09Mileage()));
        list.add(getIntValue(basicDataDto.getGear09Fuel()));
        list.add(getIntValue(basicDataDto.getGear09Duration()));
        list.add(getIntValue(basicDataDto.getGear09Number()));
        list.add(getIntValue(basicDataDto.getGear10Mileage()));
        list.add(getIntValue(basicDataDto.getGear10Fuel()));
        list.add(getIntValue(basicDataDto.getGear10Duration()));
        list.add(getIntValue(basicDataDto.getGear10Number()));
        list.add(getIntValue(basicDataDto.getGear11Mileage()));
        list.add(getIntValue(basicDataDto.getGear11Fuel()));
        list.add(getIntValue(basicDataDto.getGear11Duration()));
        list.add(getIntValue(basicDataDto.getGear11Number()));
        list.add(getIntValue(basicDataDto.getGear12Mileage()));
        list.add(getIntValue(basicDataDto.getGear12Fuel()));
        list.add(getIntValue(basicDataDto.getGear12Duration()));
        list.add(getIntValue(basicDataDto.getGear12Number()));
        list.add(getIntValue(basicDataDto.getGear13Mileage()));
        list.add(getIntValue(basicDataDto.getGear13Fuel()));
        list.add(getIntValue(basicDataDto.getGear13Duration()));
        list.add(getIntValue(basicDataDto.getGear13Number()));
        list.add(getIntValue(basicDataDto.getGear14Mileage()));
        list.add(getIntValue(basicDataDto.getGear14Fuel()));
        list.add(getIntValue(basicDataDto.getGear14Duration()));
        list.add(getIntValue(basicDataDto.getGear14Number()));
        list.add(getIntValue(basicDataDto.getGear15Mileage()));
        list.add(getIntValue(basicDataDto.getGear15Fuel()));
        list.add(getIntValue(basicDataDto.getGear15Duration()));
        list.add(getIntValue(basicDataDto.getGear15Number()));
        list.add(getIntValue(basicDataDto.getGear16Mileage()));
        list.add(getIntValue(basicDataDto.getGear16Fuel()));
        list.add(getIntValue(basicDataDto.getGear16Duration()));
        list.add(getIntValue(basicDataDto.getGear16Number()));
        list.add(getIntValue(basicDataDto.getGearOtherMileage()));
        list.add(getIntValue(basicDataDto.getGearOtherFuel()));
        list.add(getIntValue(basicDataDto.getGearOtherDuration()));
        list.add(getIntValue(basicDataDto.getGearOtherNumber()));
        List<Object> rpmvalues = getRpmValues(basicDataDto);
        list.addAll(rpmvalues);
        list.add(getIntValue(basicDataDto.getNoIdleRpmSum()));
        list.add(getIntValue(basicDataDto.getNoIdleRpmCount()));
        list.add(getIntValue(basicDataDto.getRpmSum()));
        list.add(getIntValue(basicDataDto.getRpmCount()));
        list.add(getIntValue(basicDataDto.getMaxRpm()));
        list.add(getIntValue(basicDataDto.getMinRpm()));
        list.add(getIntValue(basicDataDto.getAvgRpm()));
        list.add(getIntValue(basicDataDto.getAvgNoIdleRpm()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp50Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp70Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp80Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp85Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp90Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp95Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp100Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp105Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp110Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp115Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp120Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp125Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp130Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp135Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp140Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp145Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTemp150Duration()));
        list.add(getIntValue(basicDataDto.getWorkWaterTempOver150Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp50Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp70Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp80Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp85Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp90Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp95Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp100Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp105Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp110Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp115Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp120Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp125Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp130Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp135Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp140Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp145Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTemp150Duration()));
        list.add(getIntValue(basicDataDto.getIdleWaterTempOver150Duration()));
        list.add(getIntValue(basicDataDto.getMaxWorkWaterTemp()));
        list.add(getIntValue(basicDataDto.getMinWorkWaterTemp()));
        list.add(getIntValue(basicDataDto.getWorkWaterTempSum()));
        list.add(getIntValue(basicDataDto.getWorkWaterTempCount()));
        list.add(getIntValue(basicDataDto.getAvgWorkWaterTemp()));
        list.add(getIntValue(basicDataDto.getMaxIdleWaterTemp()));
        list.add(getIntValue(basicDataDto.getMinIdleWaterTemp()));
        list.add(getIntValue(basicDataDto.getIdleWaterTempSum()));
        list.add(getIntValue(basicDataDto.getIdleWaterTempCount()));
        list.add(getIntValue(basicDataDto.getAvgIdleWaterTemp()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent0Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent10Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent20Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent30Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent40Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent50Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent60Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent70Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent80Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent90Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent99Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercent100Duration()));
        list.add(getIntValue(basicDataDto.getGasOpenPercentCount()));
        list.add(getIntValue(basicDataDto.getGasOpenPercentSum()));
        list.add(getIntValue(basicDataDto.getAvgGasOpenPercent()));
        list.add(getIntValue(basicDataDto.getTorque0Duration()));
        list.add(getIntValue(basicDataDto.getTorque10Duration()));
        list.add(getIntValue(basicDataDto.getTorque20Duration()));
        list.add(getIntValue(basicDataDto.getTorque30Duration()));
        list.add(getIntValue(basicDataDto.getTorque40Duration()));
        list.add(getIntValue(basicDataDto.getTorque50Duration()));
        list.add(getIntValue(basicDataDto.getTorque60Duration()));
        list.add(getIntValue(basicDataDto.getTorque70Duration()));
        list.add(getIntValue(basicDataDto.getTorque80Duration()));
        list.add(getIntValue(basicDataDto.getTorque90Duration()));
        list.add(getIntValue(basicDataDto.getTorque99Duration()));
        list.add(getIntValue(basicDataDto.getTorque100Duration()));
        list.add(getIntValue(basicDataDto.getMaxTorque()));
        list.add(getIntValue(basicDataDto.getMinTorque()));
        list.add(getIntValue(basicDataDto.getTorqueSum()));
        list.add(getIntValue(basicDataDto.getTorqueCount()));
        list.add(getIntValue(basicDataDto.getAvgTorque()));
        list.add(getIntValue(basicDataDto.getIat50Duration()));
        list.add(getIntValue(basicDataDto.getIat70Duration()));
        list.add(getIntValue(basicDataDto.getIat80Duration()));
        list.add(getIntValue(basicDataDto.getIat85Duration()));
        list.add(getIntValue(basicDataDto.getIat90Duration()));
        list.add(getIntValue(basicDataDto.getIat95Duration()));
        list.add(getIntValue(basicDataDto.getIat100Duration()));
        list.add(getIntValue(basicDataDto.getIat105Duration()));
        list.add(getIntValue(basicDataDto.getIat110Duration()));
        list.add(getIntValue(basicDataDto.getIat115Duration()));
        list.add(getIntValue(basicDataDto.getIat120Duration()));
        list.add(getIntValue(basicDataDto.getIat125Duration()));
        list.add(getIntValue(basicDataDto.getIat130Duration()));
        list.add(getIntValue(basicDataDto.getIat135Duration()));
        list.add(getIntValue(basicDataDto.getIat140Duration()));
        list.add(getIntValue(basicDataDto.getIat145Duration()));
        list.add(getIntValue(basicDataDto.getIat150Duration()));
        list.add(getIntValue(basicDataDto.getIatOver150Duration()));
        list.add(getIntValue(basicDataDto.getIatSum()));
        list.add(getIntValue(basicDataDto.getIatCount()));
        list.add(getIntValue(basicDataDto.getMaxIat()));
        list.add(getIntValue(basicDataDto.getMinIat()));
        list.add(getIntValue(basicDataDto.getAvgIat()));
        list.add(getIntValue(basicDataDto.getIp50Duration()));
        list.add(getIntValue(basicDataDto.getIp60Duration()));
        list.add(getIntValue(basicDataDto.getIp70Duration()));
        list.add(getIntValue(basicDataDto.getIp80Duration()));
        list.add(getIntValue(basicDataDto.getIp90Duration()));
        list.add(getIntValue(basicDataDto.getIp100Duration()));
        list.add(getIntValue(basicDataDto.getIp110Duration()));
        list.add(getIntValue(basicDataDto.getIp120Duration()));
        list.add(getIntValue(basicDataDto.getIp130Duration()));
        list.add(getIntValue(basicDataDto.getIp140Duration()));
        list.add(getIntValue(basicDataDto.getIp150Duration()));
        list.add(getIntValue(basicDataDto.getIpOver150Duration()));
        list.add(getIntValue(basicDataDto.getIpSum()));
        list.add(getIntValue(basicDataDto.getIpCount()));
        list.add(getIntValue(basicDataDto.getMaxIp()));
        list.add(getIntValue(basicDataDto.getMinIp()));
        list.add(getIntValue(basicDataDto.getAvgIp()));
        list.add(getIntValue(basicDataDto.getSo90Number()));
        list.add(getIntValue(basicDataDto.getSo90Duration()));
        list.add(getIntValue(basicDataDto.getSo90Mileage()));
        list.add(getIntValue(basicDataDto.getSo90100kmTimes()));
        list.add(getIntValue(basicDataDto.getSo90DurationProportion()));
        list.add(getIntValue(basicDataDto.getSo90MileageProportion()));
        list.add(getIntValue(basicDataDto.getSo120Number()));
        list.add(getIntValue(basicDataDto.getSo120Duration()));
        list.add(getIntValue(basicDataDto.getSo120Mileage()));
        list.add(getIntValue(basicDataDto.getSo120100kmTimes()));
        list.add(getIntValue(basicDataDto.getSo120DurationProportion()));
        list.add(getIntValue(basicDataDto.getSo120MileageProportion()));
        list.add(getIntValue(basicDataDto.getSrNumber()));
        list.add(getIntValue(basicDataDto.getSrDuration()));
        list.add(getIntValue(basicDataDto.getSrMileage()));
        list.add(getIntValue(basicDataDto.getSrFuel()));
        list.add(getIntValue(basicDataDto.getSr100kmTimes()));
        list.add(getIntValue(basicDataDto.getSrDurationProportion()));
        list.add(getIntValue(basicDataDto.getSrMileageProportion()));
        list.add(getIntValue(basicDataDto.getLrogNumber()));
        list.add(getIntValue(basicDataDto.getLrogDuration()));
        list.add(getIntValue(basicDataDto.getLrogMileage()));
        list.add(getIntValue(basicDataDto.getLrogFuel()));
        list.add(getIntValue(basicDataDto.getLrog100kmTimes()));
        list.add(getIntValue(basicDataDto.getLrogDurationProportion()));
        list.add(getIntValue(basicDataDto.getLrogMileageProportion()));
        list.add(getIntValue(basicDataDto.getHsbNumber()));
        list.add(getIntValue(basicDataDto.getHsbDuration()));
        list.add(getIntValue(basicDataDto.getHsbMileage()));
        list.add(getIntValue(basicDataDto.getHsb100kmTimes()));
        list.add(getIntValue(basicDataDto.getHsbDurationProportion()));
        list.add(getIntValue(basicDataDto.getHsbMileageProportion()));
        list.add(getIntValue(basicDataDto.getCsbNumber()));
        list.add(getIntValue(basicDataDto.getCsbDuration()));
        list.add(getIntValue(basicDataDto.getCsbMileage()));
        list.add(getIntValue(basicDataDto.getCsb100kmTimes()));
        list.add(getIntValue(basicDataDto.getCsbDurationProportion()));
        list.add(getIntValue(basicDataDto.getCsbMileageProportion()));
        list.add(getIntValue(basicDataDto.getClutchNumber()));
        list.add(getIntValue(basicDataDto.getClutchDuration()));
        list.add(getIntValue(basicDataDto.getClutchMileage()));
        list.add(getIntValue(basicDataDto.getClutch100kmTimes()));
        list.add(getIntValue(basicDataDto.getClutchDurationProportion()));
        list.add(getIntValue(basicDataDto.getClutchMileageProportion()));
        list.add(getIntValue(basicDataDto.getNgCoastDuration()));
        list.add(getIntValue(basicDataDto.getNgCoastFuel()));
        list.add(getIntValue(basicDataDto.getNgCoastMileage()));
        list.add(getIntValue(basicDataDto.getNgCoastNumber()));
        list.add(getIntValue(basicDataDto.getNg100kmTimes()));
        list.add(getIntValue(basicDataDto.getNgDurationProportion()));
        list.add(getIntValue(basicDataDto.getNgMileageProportion()));
        list.add(getIntValue(basicDataDto.getIdleFuel()));
        list.add(getIntValue(basicDataDto.getIdleDuration()));
        list.add(getIntValue(basicDataDto.getIdleNumber()));
        list.add(getIntValue(basicDataDto.getIdle100kmTimes()));
        list.add(getIntValue(basicDataDto.getIdleDurationProportion()));
        list.add(getIntValue(basicDataDto.getFoutTimes()));
        list.add(getIntValue(basicDataDto.getFoutDuration()));
        list.add(getIntValue(basicDataDto.getFout100kmTimes()));
        list.add(getIntValue(basicDataDto.getFoutDurationProportion()));

        Map<String, AltitudeDto> altitudeDtoMap = basicDataDto.getAltitudeDtoMap();
        Row altitudeInfoRow = getAslRow(altitudeDtoMap);
        list.add(altitudeInfoRow);

        VehicleHourInfoDto vehicleHourInfoDto = basicDataDto.getVehicleHourInfoDto();

        if(vehicleHourInfoDto != null ){
            Map<String, VehicleHourInfoDto.VehicleHourBean> vehicleHourBeanMap = vehicleHourInfoDto.getVehicleHourBeanMap();
            Row vehicleHourInfoRow = getHourRow(vehicleHourBeanMap);
            list.add(vehicleHourInfoRow);
        } else {
            list.add(null);
        }

        list.add(basicDataDto.getUpdateTime());
        //add row start
        list.add(getIntValue(basicDataDto.getSharpTurningMil()));
        list.add(getIntValue(basicDataDto.getSo90Fuel()));
        list.add(getIntValue(basicDataDto.getSo120Fuel()));
        list.add(getIntValue(basicDataDto.getFatigueDrivingDuration()));


        //新增按行程累加的吨/公里字段的值
        String tonKM = null;
        try {
            tonKM = JsonUtil.toJson(basicDataDto.getTonKMDtos());
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        list.add(tonKM);

        //新增按行程累加的经过城市详细信息字段的值
        String crossCityInfo = null;
        try {
            crossCityInfo = JsonUtil.toJson(basicDataDto.getCrossCitiesInfos());
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        list.add(crossCityInfo);

        //新增不同载重类型的里程和油耗信息字段的值
        list.add(getWloadInfo(basicDataDto.getWLoadInfoDto()));
        //各车厂不同需求字段，在单独的实例中实现
        List<Object> customValues = getCustomValues(basicDataDto);
        list.addAll(customValues);
        return new GenericRowWithSchema(list.toArray(),schema);
    }

    @Override
    public AbstractBasicDataDto convertDataset(Row row) {
        AbstractBasicDataDto basicDataDto = new AbstractBasicDataDto();
        basicDataDto.setUid(row.getAs("uid"));
        basicDataDto.setTid(row.getAs("tid"));
        basicDataDto.setSharpStepOnGasNumber(row.getAs("sharp_step_on_gas_number"));
        basicDataDto.setTripPower(row.getAs("trip_power"));
        basicDataDto.setTripMileage(row.getAs("trip_mileage"));
        basicDataDto.setTripFuel(row.getAs("trip_fuel"));
        basicDataDto.setTripDuration(row.getAs("trip_duration"));
        basicDataDto.setInGearCoastMileage(row.getAs("in_gear_coast_mileage"));
        basicDataDto.setInGearCoastDuration(row.getAs("in_gear_coast_duration"));
        basicDataDto.setInGearCoastNumber(row.getAs("in_gear_coast_number"));
        basicDataDto.setBrakeNumber(row.getAs("brake_number"));
        basicDataDto.setBrakeMileage(row.getAs("brake_mileage"));
        basicDataDto.setBrakeDuration(row.getAs("brake_duration"));
        basicDataDto.setVehicleEstimatedLoad(row.getAs("vehicle_estimated_load"));
        basicDataDto.setRouteIntegralMileage(row.getAs("route_integral_mileage"));
        basicDataDto.setRouteIntegralFuel(row.getAs("route_integral_fuel"));
        basicDataDto.setParkingPowerOnDuration(row.getAs("parking_power_on_duration"));
        basicDataDto.setCityDrivingMileage(row.getAs("city_driving_mileage"));
        basicDataDto.setCityDrivingDuration(row.getAs("city_driving_duration"));
        basicDataDto.setCityDrivingFuel(row.getAs("city_driving_fuel"));
        basicDataDto.setRuralDrivingMileage(row.getAs("rural_driving_mileage"));
        basicDataDto.setRuralDrivingDuration(row.getAs("rural_driving_duration"));
        basicDataDto.setRuralDrivingFuel(row.getAs("rural_driving_fuel"));
        basicDataDto.setEcoDrivingMileage(row.getAs("eco_driving_mileage"));
        basicDataDto.setEcoDrivingDuration(row.getAs("eco_driving_duration"));
        basicDataDto.setEcoDrivingFuel(row.getAs("eco_driving_fuel"));
        basicDataDto.setUpSlopeDrivingMileage(row.getAs("up_slope_driving_mileage"));
        basicDataDto.setUpSlopeDrivingDuration(row.getAs("up_slope_driving_duration"));
        basicDataDto.setUpSlopeDrivingFuel(row.getAs("up_slope_driving_fuel"));
        basicDataDto.setDownSlopeDrivingMileage(row.getAs("down_slope_driving_mileage"));
        basicDataDto.setDownSlopeDrivingDuration(row.getAs("down_slope_driving_duration"));
        basicDataDto.setDownSlopeDrivingFuel(row.getAs("down_slope_driving_fuel"));
        basicDataDto.setLevelRoadDrivingMileage(row.getAs("level_road_driving_mileage"));
        basicDataDto.setLevelRoadDrivingDuration(row.getAs("level_road_driving_duration"));
        basicDataDto.setLevelRoadDrivingFuel(row.getAs("level_road_driving_fuel"));
        basicDataDto.setVehicleColdStartMileage(row.getAs("vehicle_cold_start_mileage"));
        basicDataDto.setVehicleColdStartDuration(row.getAs("vehicle_cold_start_duration"));
        basicDataDto.setVehicleColdStartFuel(row.getAs("vehicle_cold_start_fuel"));
        basicDataDto.setSharpTurningNumber(row.getAs("sharp_turning_number"));
        basicDataDto.setCruiseMileage(row.getAs("cruise_mileage"));
        basicDataDto.setCruiseDuration(row.getAs("cruise_duration"));
        basicDataDto.setCruiseFuel(row.getAs("cruise_fuel"));
        basicDataDto.setShiftGearsNumber(row.getAs("shift_gears_number"));
        basicDataDto.setSharpDownSpeedDuration(row.getAs("sharp_down_speed_duration"));
        basicDataDto.setSharpDownSpeedMileage(row.getAs("sharp_down_speed_mileage"));
        basicDataDto.setSharpDownSpeedNumber(row.getAs("sharp_down_speed_number"));
        basicDataDto.setSharpUpSpeedDuration(row.getAs("sharp_up_speed_duration"));
        basicDataDto.setSharpUpSpeedMileage(row.getAs("sharp_up_speed_mileage"));
        basicDataDto.setSharpUpSpeedNumber(row.getAs("sharp_up_speed_number"));
        basicDataDto.setSharpUpSpeedFuel(row.getAs("sharp_up_speed_fuel"));
        basicDataDto.setSharpStepOnGasMileage(row.getAs("sharp_step_on_gas_mileage"));
        basicDataDto.setSharpStepOnGasDuration(row.getAs("sharp_step_on_gas_duration"));
        basicDataDto.setSharpStepOnGasFuel(row.getAs("sharp_step_on_gas_fuel"));
        basicDataDto.setVehicleParkNumber(row.getAs("vehicle_park_number"));
        basicDataDto.setVehicleStartNumber(row.getAs("vehicle_start_number"));
        basicDataDto.setVehicleColdStartNumber(row.getAs("vehicle_cold_start_number"));
        basicDataDto.setChargeFuel(row.getAs("charge_fuel"));
        basicDataDto.setLeakFuel(row.getAs("leak_fuel"));
        basicDataDto.setVehicleStartDuration(row.getAs("vehicle_start_duration"));
        basicDataDto.setVehicleStartFuel(row.getAs("vehicle_start_fuel"));
        basicDataDto.setGasStabilityNumber(row.getAs("gas_stability_number"));
        basicDataDto.setGasStabilityDuration(row.getAs("gas_stability_duration"));
        String crossCities = row.getAs("cross_cities");
        if(StringUtils.isNotEmpty(crossCities)){
            Set<String> crossCitiesSet = new HashSet<>(Arrays.asList(crossCities.split(",")));
            basicDataDto.setCrossCities(StringUtils.join(crossCitiesSet, ","));
        }
        basicDataDto.setAssistBrakeMileage(row.getAs("assist_brake_mileage"));
        basicDataDto.setAssistBrakeDuration(row.getAs("assist_brake_duration"));
        basicDataDto.setFatigueDrivingNumber(row.getAs("fatigue_driving_number"));
        basicDataDto.setParkThrottleDuration(row.getAs("park_throttle_duration"));
        basicDataDto.setParkThrottleFuel(row.getAs("park_throttle_fuel"));
        basicDataDto.setEngineWorkDuration(row.getAs("engine_work_duration"));
        basicDataDto.setDrivingHandbrakeNumber(row.getAs("driving_handbrake_number"));
        basicDataDto.setDrivingHandbrakeDuration(row.getAs("driving_handbrake_duration"));
        basicDataDto.setDrivingHandbrakeMileage(row.getAs("driving_handbrake_mileage"));
        basicDataDto.setIdleHandbrakeNumber(row.getAs("idle_handbrake_number"));
        basicDataDto.setIdleHandbrakeDuration(row.getAs("idle_handbrake_duration"));
        Long mileage = DataUtil.getValue(basicDataDto.getTripMileage(), 0);
        Long tripDuration = DataUtil.getValue(basicDataDto.getTripDuration(), 0);
//        basicDataDto.setFoutTimes(row.getAs("fout_times"));
//        basicDataDto.setFoutDuration(row.getAs("fout_duration"));
        basicDataDto.setAvgSpeed(DataUtil.remainTwoBit(basicDataDto.getTripMileage(), basicDataDto.getTripDuration()));
        //速度区间信息
        calcSpeedInfo(row, basicDataDto);
        //挡位累计
        calcGearInfo(row, basicDataDto);
        //车辆运行水温
        calcWorkWaterTempInfo(row, basicDataDto);
        //怠速水温
        calcIdleWaterTempInfo(row, basicDataDto);
        //油门开度
        calcGasOpenPercent(row, basicDataDto);
        //发动机扭矩
        calcTorqueInfo(row, basicDataDto);
        //发动机进气温度
        calcIatInfo(row, basicDataDto);
        //发动机进气压力
        calcIpInfo(row, basicDataDto);
        //超速90km
        calcSo90(row, basicDataDto, mileage, tripDuration);
        //超速120km
        calcSo120Info(row, basicDataDto, mileage, tripDuration);
        //超转速信息
        calcSrInfo(row, basicDataDto, mileage, tripDuration);
        //低转速（脱档)
        calcLrog(row, basicDataDto, mileage, tripDuration);
        //高速刹车信息
        calcHsbInfo(row, basicDataDto, mileage, tripDuration);
        //普通刹车信息
        calcCsbInfo(row, basicDataDto, mileage, tripDuration);
        //离合相关信息
        calcClutchInfo(row, basicDataDto, mileage, tripDuration);
        //空挡滑行信息
        calcNgCoastInfo(row, basicDataDto, mileage, tripDuration);
        //怠速相关信息
        calcIdleInfo(row, basicDataDto, mileage, tripDuration);
        //熄火信息及每个小时车辆的运行状态
        calcFout(basicDataDto, mileage, tripDuration);
        calcAltitudeInfo(row, basicDataDto);
        calcVehicleHourInfo(row, basicDataDto);

        basicDataDto.setUpdateTime(new Timestamp(System.currentTimeMillis()));

        //add row start
        basicDataDto.setSharpTurningMil(row.getAs("sharp_turning_mil"));
        basicDataDto.setSo90Fuel(row.getAs("so90_fuel"));
        basicDataDto.setSo120Fuel(row.getAs("so120_fuel"));
        basicDataDto.setFatigueDrivingDuration(row.getAs("fatigue_driving_duration"));
        //计算吨/公里
        calcTonKM(row, basicDataDto);
        //计算经过城市详情信息
        calcCrossCitiesInfo(row, basicDataDto);
        //计算满半空状态下的里程和油耗
        calcWloadTypeInfo(row, basicDataDto);
        //发动机转速区间
        setRpmRangeInfo(row, basicDataDto);
        //设置车场各自的需求字段信息
        basicDataDto.setOdoMileage(row.getAs("odo_mileage"));
        basicDataDto.setRunDays(row.getAs("run_days"));
        setCustomInfo(row, basicDataDto);
        return basicDataDto;
    }

    protected Integer getIntValue(Long value) {
        if (value == null) {
            return null;
        }
        return value.intValue();
    }

    protected Integer getIntValue(Integer value) {
        if (value == null) {
            return null;
        }
        return value;
    }

    protected Row getHourRow(Map<String, VehicleHourInfoDto.VehicleHourBean> vehicleHourBeanMap) {
        if(vehicleHourBeanMap == null || vehicleHourBeanMap.isEmpty()){
            return null;
        }
        List<Row> rowList = new ArrayList<>();
        for(String hourKey : VehicleHourInfoDto.hourKeys){
            VehicleHourInfoDto.VehicleHourBean vehicleHourBean = vehicleHourBeanMap.get(hourKey);
            if(vehicleHourBean != null){
                Row hourRow = RowFactory.create(
                        vehicleHourBean.getState(),
                        vehicleHourBean.getTime(),
                        vehicleHourBean.getMileage(),
                        vehicleHourBean.getFuel());
                rowList.add(hourRow);
            } else {
                rowList.add(null);
            }
        }

        return RowFactory.create(rowList.toArray());
    }

    protected Row getWloadInfo(WLoadInfoDto wLoadInfoDto){
        if(null==wLoadInfoDto || null==wLoadInfoDto.getWLoadInfoMap()){
            return null;
        }

        List<Row> rowList = new ArrayList<>();
        Map<String, WLoadInfoDto.WLoadInfo> wLoadInfoMap = wLoadInfoDto.getWLoadInfoMap();
        for(String key : WLoadInfoDto.typeKeys){
            WLoadInfoDto.WLoadInfo wLoadInfo = wLoadInfoMap.get(key);
            if(null!=wLoadInfo){
                rowList.add(RowFactory.create(wLoadInfo.getMileage(),wLoadInfo.getFuel()));
            }else{
                rowList.add(null);
            }
        }

        return RowFactory.create(rowList.toArray());
    }

    protected Row getAslRow(Map<String, AltitudeDto> altitudeDtoMap) {
        if(altitudeDtoMap == null || altitudeDtoMap.isEmpty()){
            return null;
        }
        List<Row> rowList = new ArrayList<>();
        for(String hourKey : AltitudeDto.aslKeys){
            AltitudeDto altitudeDto = altitudeDtoMap.get(hourKey);
            if(altitudeDto != null){
                Row hourRow = RowFactory.create(
                        altitudeDto.getTime(),
                        altitudeDto.getMileage(),
                        altitudeDto.getFuel());
                rowList.add(hourRow);
            } else {
                rowList.add(null);
            }
        }

        return RowFactory.create(rowList.toArray());
    }

    protected void calcVehicleHourInfo(Row row, AbstractBasicDataDto basicDataDto) {
        WrappedArray.ofRef array = row.getAs("vehicle_hour_infos");
        if(array == null){
            return;
        }
        scala.collection.Iterator<String> clockRangesItor = array.iterator();
        TypeReference<Map<String, VehicleHourInfoDto.VehicleHourBean>> types = new TypeReference<Map<String, VehicleHourInfoDto.VehicleHourBean>>(){};
        Map<String, VehicleHourInfoDto.VehicleHourBean> vehicleHourBeanMap = new HashMap<>();
        VehicleHourInfoDto vehicleHourInfoDto = new VehicleHourInfoDto();
        while(clockRangesItor.hasNext()){
            String hour = clockRangesItor.next();
            Map<String, VehicleHourInfoDto.VehicleHourBean> vehicleHourBeanMapFromJson = JSON.parseObject(hour, types);
            vehicleHourBeanMapFromJson.forEach((key, value) -> {
                String hourKey = key;
                VehicleHourInfoDto.VehicleHourBean vehicleHourBean = vehicleHourBeanMap.get(hourKey);
                if (vehicleHourBean == null) {
                    vehicleHourBean = new VehicleHourInfoDto.VehicleHourBean();
                    vehicleHourBean.setState(1);
                    vehicleHourBeanMap.put(hourKey, vehicleHourBean);
                }

                vehicleHourBean.accumulationTime(value.getTime());
                vehicleHourBean.accumulationMileage(value.getMileage());
                vehicleHourBean.accumulationFuel(value.getFuel());
            });
        }
        vehicleHourInfoDto.setVehicleHourBeanMap(vehicleHourBeanMap);
        basicDataDto.setVehicleHourInfoDto(vehicleHourInfoDto);
    }
    /***
     * 海拔相关信息
     * @param row
     * @param basicDataDto
     */
    protected void calcAltitudeInfo(Row row, AbstractBasicDataDto basicDataDto) {
        WrappedArray.ofRef array = row.getAs("altitude_infos");
        if(array == null){
            return;
        }
        scala.collection.Iterator<String> altitudeItor = array.iterator();
        TypeReference<Map<String, AltitudeDto>> types = new TypeReference<Map<String, AltitudeDto>>(){};
        Map<String, AltitudeDto> altitudeDtoMap = new HashMap<>();
        while(altitudeItor.hasNext()){
            String altitude = altitudeItor.next();
            Map<String, AltitudeDto> altitudeTempMap = JSON.parseObject(altitude, types);
            altitudeTempMap.forEach((key, value) -> {
                AltitudeDto altitudeDto = altitudeDtoMap.get(key);
                if (altitudeDto == null) {
                    altitudeDto = new AltitudeDto();
                    altitudeDtoMap.put(key, altitudeDto);
                }
                altitudeDto.setFuel(altitudeDto.getFuel() + value.getFuel());
                altitudeDto.setMileage(altitudeDto.getMileage() + value.getMileage());
                altitudeDto.setTime(altitudeDto.getTime() + value.getTime());
            });
        }

        if(altitudeDtoMap.isEmpty()){
            return;
        }
        basicDataDto.setAltitudeDtoMap(altitudeDtoMap);
    }

    protected void calcSpeedInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setSpeedRange01Mileage(row.getAs("speed_range01_mileage"));
        basicDataDto.setSpeedRange01Duration(row.getAs("speed_range01_duration"));
        basicDataDto.setSpeedRange01Fuel(row.getAs("speed_range01_fuel"));
        basicDataDto.setSpeedRange02Mileage(row.getAs("speed_range02_mileage"));
        basicDataDto.setSpeedRange02Duration(row.getAs("speed_range02_duration"));
        basicDataDto.setSpeedRange02Fuel(row.getAs("speed_range02_fuel"));
        basicDataDto.setSpeedRange03Mileage(row.getAs("speed_range03_mileage"));
        basicDataDto.setSpeedRange03Duration(row.getAs("speed_range03_duration"));
        basicDataDto.setSpeedRange03Fuel(row.getAs("speed_range03_fuel"));
        basicDataDto.setSpeedRange04Mileage(row.getAs("speed_range04_mileage"));
        basicDataDto.setSpeedRange04Duration(row.getAs("speed_range04_duration"));
        basicDataDto.setSpeedRange04Fuel(row.getAs("speed_range04_fuel"));
        basicDataDto.setSpeedRange05Mileage(row.getAs("speed_range05_mileage"));
        basicDataDto.setSpeedRange05Duration(row.getAs("speed_range05_duration"));
        basicDataDto.setSpeedRange05Fuel(row.getAs("speed_range05_fuel"));
        basicDataDto.setSpeedRange06Mileage(row.getAs("speed_range06_mileage"));
        basicDataDto.setSpeedRange06Duration(row.getAs("speed_range06_duration"));
        basicDataDto.setSpeedRange06Fuel(row.getAs("speed_range06_fuel"));
        basicDataDto.setSpeedRange07Mileage(row.getAs("speed_range07_mileage"));
        basicDataDto.setSpeedRange07Duration(row.getAs("speed_range07_duration"));
        basicDataDto.setSpeedRange07Fuel(row.getAs("speed_range07_fuel"));
        basicDataDto.setSpeedRange08Mileage(row.getAs("speed_range08_mileage"));
        basicDataDto.setSpeedRange08Duration(row.getAs("speed_range08_duration"));
        basicDataDto.setSpeedRange08Fuel(row.getAs("speed_range08_fuel"));
        basicDataDto.setSpeedRange09Mileage(row.getAs("speed_range09_mileage"));
        basicDataDto.setSpeedRange09Duration(row.getAs("speed_range09_duration"));
        basicDataDto.setSpeedRange09Fuel(row.getAs("speed_range09_fuel"));
        basicDataDto.setSpeedRange10Mileage(row.getAs("speed_range10_mileage"));
        basicDataDto.setSpeedRange10Duration(row.getAs("speed_range10_duration"));
        basicDataDto.setSpeedRange10Fuel(row.getAs("speed_range10_fuel"));
        basicDataDto.setSpeedRange11Mileage(row.getAs("speed_range11_mileage"));
        basicDataDto.setSpeedRange11Duration(row.getAs("speed_range11_duration"));
        basicDataDto.setSpeedRange11Fuel(row.getAs("speed_range11_fuel"));
        basicDataDto.setSpeedRange12Mileage(row.getAs("speed_range12_mileage"));
        basicDataDto.setSpeedRange12Duration(row.getAs("speed_range12_duration"));
        basicDataDto.setSpeedRange12Fuel(row.getAs("speed_range12_fuel"));
        basicDataDto.setExceedSpeedRangeMileage(row.getAs("exceed_speed_range_mileage"));
        basicDataDto.setExceedSpeedRangeDuration(row.getAs("exceed_speed_range_duration"));
        basicDataDto.setExceedSpeedRangeFuel(row.getAs("exceed_speed_range_fuel"));
        basicDataDto.setMaxSpeed(row.getAs("max_speed"));
        basicDataDto.setMinSpeed(row.getAs("min_speed"));
        basicDataDto.setMaxUsefulSpeed(row.getAs("max_useful_speed"));
        basicDataDto.setMinUsefulSpeed(row.getAs("min_useful_speed"));
    }

    protected void calcGearInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setGear01Mileage(row.getAs("gear01_mileage"));
        basicDataDto.setGear01Fuel(row.getAs("gear01_fuel"));
        basicDataDto.setGear01Duration(row.getAs("gear01_duration"));
        basicDataDto.setGear01Number(row.getAs("gear01_number"));
        basicDataDto.setGear02Mileage(row.getAs("gear02_mileage"));
        basicDataDto.setGear02Fuel(row.getAs("gear02_fuel"));
        basicDataDto.setGear02Duration(row.getAs("gear02_duration"));
        basicDataDto.setGear02Number(row.getAs("gear02_number"));
        basicDataDto.setGear03Mileage(row.getAs("gear03_mileage"));
        basicDataDto.setGear03Fuel(row.getAs("gear03_fuel"));
        basicDataDto.setGear03Duration(row.getAs("gear03_duration"));
        basicDataDto.setGear03Number(row.getAs("gear03_number"));
        basicDataDto.setGear04Mileage(row.getAs("gear04_mileage"));
        basicDataDto.setGear04Fuel(row.getAs("gear04_fuel"));
        basicDataDto.setGear04Duration(row.getAs("gear04_duration"));
        basicDataDto.setGear04Number(row.getAs("gear04_number"));
        basicDataDto.setGear05Mileage(row.getAs("gear05_mileage"));
        basicDataDto.setGear05Fuel(row.getAs("gear05_fuel"));
        basicDataDto.setGear05Duration(row.getAs("gear05_duration"));
        basicDataDto.setGear05Number(row.getAs("gear05_number"));
        basicDataDto.setGear06Mileage(row.getAs("gear06_mileage"));
        basicDataDto.setGear06Fuel(row.getAs("gear06_fuel"));
        basicDataDto.setGear06Duration(row.getAs("gear06_duration"));
        basicDataDto.setGear06Number(row.getAs("gear06_number"));
        basicDataDto.setGear07Mileage(row.getAs("gear07_mileage"));
        basicDataDto.setGear07Fuel(row.getAs("gear07_fuel"));
        basicDataDto.setGear07Duration(row.getAs("gear07_duration"));
        basicDataDto.setGear07Number(row.getAs("gear07_number"));
        basicDataDto.setGear08Mileage(row.getAs("gear08_mileage"));
        basicDataDto.setGear08Fuel(row.getAs("gear08_fuel"));
        basicDataDto.setGear08Duration(row.getAs("gear08_duration"));
        basicDataDto.setGear08Number(row.getAs("gear08_number"));
        basicDataDto.setGear09Mileage(row.getAs("gear09_mileage"));
        basicDataDto.setGear09Fuel(row.getAs("gear09_fuel"));
        basicDataDto.setGear09Duration(row.getAs("gear09_duration"));
        basicDataDto.setGear09Number(row.getAs("gear09_number"));
        basicDataDto.setGear10Mileage(row.getAs("gear10_mileage"));
        basicDataDto.setGear10Fuel(row.getAs("gear10_fuel"));
        basicDataDto.setGear10Duration(row.getAs("gear10_duration"));
        basicDataDto.setGear10Number(row.getAs("gear10_number"));
        basicDataDto.setGear11Mileage(row.getAs("gear11_mileage"));
        basicDataDto.setGear11Fuel(row.getAs("gear11_fuel"));
        basicDataDto.setGear11Duration(row.getAs("gear11_duration"));
        basicDataDto.setGear11Number(row.getAs("gear11_number"));
        basicDataDto.setGear12Mileage(row.getAs("gear12_mileage"));
        basicDataDto.setGear12Fuel(row.getAs("gear12_fuel"));
        basicDataDto.setGear12Duration(row.getAs("gear12_duration"));
        basicDataDto.setGear12Number(row.getAs("gear12_number"));
        basicDataDto.setGear13Mileage(row.getAs("gear13_mileage"));
        basicDataDto.setGear13Fuel(row.getAs("gear13_fuel"));
        basicDataDto.setGear13Duration(row.getAs("gear13_duration"));
        basicDataDto.setGear13Number(row.getAs("gear13_number"));
        basicDataDto.setGear14Mileage(row.getAs("gear14_mileage"));
        basicDataDto.setGear14Fuel(row.getAs("gear14_fuel"));
        basicDataDto.setGear14Duration(row.getAs("gear14_duration"));
        basicDataDto.setGear14Number(row.getAs("gear14_number"));
        basicDataDto.setGear15Mileage(row.getAs("gear15_mileage"));
        basicDataDto.setGear15Fuel(row.getAs("gear15_fuel"));
        basicDataDto.setGear15Duration(row.getAs("gear15_duration"));
        basicDataDto.setGear15Number(row.getAs("gear15_number"));
        basicDataDto.setGear16Mileage(row.getAs("gear16_mileage"));
        basicDataDto.setGear16Fuel(row.getAs("gear16_fuel"));
        basicDataDto.setGear16Duration(row.getAs("gear16_duration"));
        basicDataDto.setGear16Number(row.getAs("gear16_number"));
        basicDataDto.setGearOtherMileage(row.getAs("gear_other_mileage"));
        basicDataDto.setGearOtherFuel(row.getAs("gear_other_fuel"));
        basicDataDto.setGearOtherDuration(row.getAs("gear_other_duration"));
        basicDataDto.setGearOtherNumber(row.getAs("gear_other_number"));
    }

    protected void calcWorkWaterTempInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setWorkWaterTemp50Duration(row.getAs("work_water_temp50_duration"));
        basicDataDto.setWorkWaterTemp70Duration(row.getAs("work_water_temp70_duration"));
        basicDataDto.setWorkWaterTemp80Duration(row.getAs("work_water_temp80_duration"));
        basicDataDto.setWorkWaterTemp85Duration(row.getAs("work_water_temp85_duration"));
        basicDataDto.setWorkWaterTemp90Duration(row.getAs("work_water_temp90_duration"));
        basicDataDto.setWorkWaterTemp95Duration(row.getAs("work_water_temp95_duration"));
        basicDataDto.setWorkWaterTemp100Duration(row.getAs("work_water_temp100_duration"));
        basicDataDto.setWorkWaterTemp105Duration(row.getAs("work_water_temp105_duration"));
        basicDataDto.setWorkWaterTemp110Duration(row.getAs("work_water_temp110_duration"));
        basicDataDto.setWorkWaterTemp115Duration(row.getAs("work_water_temp115_duration"));
        basicDataDto.setWorkWaterTemp120Duration(row.getAs("work_water_temp120_duration"));
        basicDataDto.setWorkWaterTemp125Duration(row.getAs("work_water_temp125_duration"));
        basicDataDto.setWorkWaterTemp130Duration(row.getAs("work_water_temp130_duration"));
        basicDataDto.setWorkWaterTemp135Duration(row.getAs("work_water_temp135_duration"));
        basicDataDto.setWorkWaterTemp140Duration(row.getAs("work_water_temp140_duration"));
        basicDataDto.setWorkWaterTemp145Duration(row.getAs("work_water_temp145_duration"));
        basicDataDto.setWorkWaterTemp150Duration(row.getAs("work_water_temp150_duration"));
        basicDataDto.setWorkWaterTempOver150Duration(row.getAs("work_water_temp_over150_duration"));
        basicDataDto.setMaxWorkWaterTemp(row.getAs("max_work_water_temp"));
        basicDataDto.setMinWorkWaterTemp(row.getAs("min_work_water_temp"));
        basicDataDto.setWorkWaterTempSum(row.getAs("work_water_temp_sum"));
        basicDataDto.setWorkWaterTempCount(row.getAs("work_water_temp_count"));
        basicDataDto.setAvgWorkWaterTemp(DataUtil.remainTwoBit(basicDataDto.getWorkWaterTempSum(), basicDataDto.getWorkWaterTempCount()));
    }

    protected void calcIdleWaterTempInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setIdleWaterTemp50Duration(row.getAs("idle_water_temp50_duration"));
        basicDataDto.setIdleWaterTemp70Duration(row.getAs("idle_water_temp70_duration"));
        basicDataDto.setIdleWaterTemp80Duration(row.getAs("idle_water_temp80_duration"));
        basicDataDto.setIdleWaterTemp85Duration(row.getAs("idle_water_temp85_duration"));
        basicDataDto.setIdleWaterTemp90Duration(row.getAs("idle_water_temp90_duration"));
        basicDataDto.setIdleWaterTemp95Duration(row.getAs("idle_water_temp95_duration"));
        basicDataDto.setIdleWaterTemp100Duration(row.getAs("idle_water_temp100_duration"));
        basicDataDto.setIdleWaterTemp105Duration(row.getAs("idle_water_temp105_duration"));
        basicDataDto.setIdleWaterTemp110Duration(row.getAs("idle_water_temp110_duration"));
        basicDataDto.setIdleWaterTemp115Duration(row.getAs("idle_water_temp115_duration"));
        basicDataDto.setIdleWaterTemp120Duration(row.getAs("idle_water_temp120_duration"));
        basicDataDto.setIdleWaterTemp125Duration(row.getAs("idle_water_temp125_duration"));
        basicDataDto.setIdleWaterTemp130Duration(row.getAs("idle_water_temp130_duration"));
        basicDataDto.setIdleWaterTemp135Duration(row.getAs("idle_water_temp135_duration"));
        basicDataDto.setIdleWaterTemp140Duration(row.getAs("idle_water_temp140_duration"));
        basicDataDto.setIdleWaterTemp145Duration(row.getAs("idle_water_temp145_duration"));
        basicDataDto.setIdleWaterTemp150Duration(row.getAs("idle_water_temp150_duration"));
        basicDataDto.setIdleWaterTempOver150Duration(row.getAs("idle_water_temp_over150_duration"));
        basicDataDto.setMaxIdleWaterTemp(row.getAs("max_idle_water_temp"));
        basicDataDto.setMinIdleWaterTemp(row.getAs("min_idle_water_temp"));
        basicDataDto.setIdleWaterTempSum(row.getAs("idle_water_temp_sum"));
        basicDataDto.setIdleWaterTempCount(row.getAs("idle_water_temp_count"));
        basicDataDto.setAvgIdleWaterTemp(DataUtil.remainTwoBit(basicDataDto.getIdleWaterTempSum(), basicDataDto.getIdleWaterTempCount()));
    }

    protected void calcGasOpenPercent(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setGasOpenPercent0Duration(row.getAs("gas_open_percent0_duration"));
        basicDataDto.setGasOpenPercent10Duration(row.getAs("gas_open_percent10_duration"));
        basicDataDto.setGasOpenPercent20Duration(row.getAs("gas_open_percent20_duration"));
        basicDataDto.setGasOpenPercent30Duration(row.getAs("gas_open_percent30_duration"));
        basicDataDto.setGasOpenPercent40Duration(row.getAs("gas_open_percent40_duration"));
        basicDataDto.setGasOpenPercent50Duration(row.getAs("gas_open_percent50_duration"));
        basicDataDto.setGasOpenPercent60Duration(row.getAs("gas_open_percent60_duration"));
        basicDataDto.setGasOpenPercent70Duration(row.getAs("gas_open_percent70_duration"));
        basicDataDto.setGasOpenPercent80Duration(row.getAs("gas_open_percent80_duration"));
        basicDataDto.setGasOpenPercent90Duration(row.getAs("gas_open_percent90_duration"));
        basicDataDto.setGasOpenPercent99Duration(row.getAs("gas_open_percent99_duration"));
        basicDataDto.setGasOpenPercent100Duration(row.getAs("gas_open_percent100_duration"));
        basicDataDto.setGasOpenPercentCount(row.getAs("gas_open_percent_count"));
        basicDataDto.setGasOpenPercentSum(row.getAs("gas_open_percent_sum"));
        basicDataDto.setAvgGasOpenPercent(DataUtil.remainTwoBit(basicDataDto.getGasOpenPercentSum(), basicDataDto.getGasOpenPercentCount()));
    }

    protected void calcTorqueInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setTorque0Duration(row.getAs("torque0_duration"));
        basicDataDto.setTorque10Duration(row.getAs("torque10_duration"));
        basicDataDto.setTorque20Duration(row.getAs("torque20_duration"));
        basicDataDto.setTorque30Duration(row.getAs("torque30_duration"));
        basicDataDto.setTorque40Duration(row.getAs("torque40_duration"));
        basicDataDto.setTorque50Duration(row.getAs("torque50_duration"));
        basicDataDto.setTorque60Duration(row.getAs("torque60_duration"));
        basicDataDto.setTorque70Duration(row.getAs("torque70_duration"));
        basicDataDto.setTorque80Duration(row.getAs("torque80_duration"));
        basicDataDto.setTorque90Duration(row.getAs("torque90_duration"));
        basicDataDto.setTorque99Duration(row.getAs("torque99_duration"));
        basicDataDto.setTorque100Duration(row.getAs("torque100_duration"));
        basicDataDto.setMaxTorque(row.getAs("max_torque"));
        basicDataDto.setMinTorque(row.getAs("min_torque"));
        basicDataDto.setTorqueSum(row.getAs("torque_sum"));
        basicDataDto.setTorqueCount(row.getAs("torque_count"));
        basicDataDto.setAvgTorque(DataUtil.remainTwoBit(basicDataDto.getTorqueSum(), basicDataDto.getTorqueCount()));
    }

    protected void calcIatInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setIat50Duration(row.getAs("iat50_duration"));
        basicDataDto.setIat70Duration(row.getAs("iat70_duration"));
        basicDataDto.setIat80Duration(row.getAs("iat80_duration"));
        basicDataDto.setIat85Duration(row.getAs("iat85_duration"));
        basicDataDto.setIat90Duration(row.getAs("iat90_duration"));
        basicDataDto.setIat95Duration(row.getAs("iat95_duration"));
        basicDataDto.setIat100Duration(row.getAs("iat100_duration"));
        basicDataDto.setIat105Duration(row.getAs("iat105_duration"));
        basicDataDto.setIat110Duration(row.getAs("iat110_duration"));
        basicDataDto.setIat115Duration(row.getAs("iat115_duration"));
        basicDataDto.setIat120Duration(row.getAs("iat120_duration"));
        basicDataDto.setIat125Duration(row.getAs("iat125_duration"));
        basicDataDto.setIat130Duration(row.getAs("iat130_duration"));
        basicDataDto.setIat135Duration(row.getAs("iat135_duration"));
        basicDataDto.setIat140Duration(row.getAs("iat140_duration"));
        basicDataDto.setIat145Duration(row.getAs("iat145_duration"));
        basicDataDto.setIat150Duration(row.getAs("iat150_duration"));
        basicDataDto.setIatOver150Duration(row.getAs("iat_over150_duration"));
        basicDataDto.setIatSum(row.getAs("iat_sum"));
        basicDataDto.setIatCount(row.getAs("iat_count"));
        basicDataDto.setMaxIat(row.getAs("max_iat"));
        basicDataDto.setMinIat(row.getAs("min_iat"));
        basicDataDto.setAvgIat(DataUtil.remainTwoBit(basicDataDto.getIatSum(), basicDataDto.getIatCount()));

    }
    /***
     * 发动机进气压力
     * @param row
     * @param basicDataDto
     */
    protected void calcIpInfo(Row row, AbstractBasicDataDto basicDataDto) {
        basicDataDto.setIp50Duration(row.getAs("ip50_duration"));
        basicDataDto.setIp60Duration(row.getAs("ip60_duration"));
        basicDataDto.setIp70Duration(row.getAs("ip70_duration"));
        basicDataDto.setIp80Duration(row.getAs("ip80_duration"));
        basicDataDto.setIp90Duration(row.getAs("ip90_duration"));
        basicDataDto.setIp100Duration(row.getAs("ip100_duration"));
        basicDataDto.setIp110Duration(row.getAs("ip110_duration"));
        basicDataDto.setIp120Duration(row.getAs("ip120_duration"));
        basicDataDto.setIp130Duration(row.getAs("ip130_duration"));
        basicDataDto.setIp140Duration(row.getAs("ip140_duration"));
        basicDataDto.setIp150Duration(row.getAs("ip150_duration"));
        basicDataDto.setIpOver150Duration(row.getAs("ip_over150_duration"));
        basicDataDto.setIpSum(row.getAs("ip_sum"));
        basicDataDto.setIpCount(row.getAs("ip_count"));
        basicDataDto.setMaxIp(row.getAs("max_ip"));
        basicDataDto.setMinIp(row.getAs("min_ip"));
        basicDataDto.setAvgIp(DataUtil.remainTwoBit(basicDataDto.getIpSum(), basicDataDto.getIpCount()));
    }
    /***
     * 超速90km
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcSo90(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setSo90Number(row.getAs("so90_number"));
        basicDataDto.setSo90Duration(row.getAs("so90_duration"));
        basicDataDto.setSo90Mileage(row.getAs("so90_mileage"));
        basicDataDto.setSo90100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getSo90Number(), mileage));
        basicDataDto.setSo90DurationProportion(DataUtil.durationProportion(basicDataDto.getSo90Duration(), tripDuration));
        basicDataDto.setSo90MileageProportion(DataUtil.mileageProportion(basicDataDto.getSo90Mileage(), mileage));
    }
    /***
     * 超速120km
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcSo120Info(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setSo120Number(row.getAs("so120_number"));
        basicDataDto.setSo120Duration(row.getAs("so120_duration"));
        basicDataDto.setSo120Mileage(row.getAs("so120_mileage"));
        basicDataDto.setSo120100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getSo120Number(), mileage));
        basicDataDto.setSo120DurationProportion(DataUtil.durationProportion(basicDataDto.getSo120Duration(), tripDuration));
        basicDataDto.setSo120MileageProportion(DataUtil.mileageProportion(basicDataDto.getSo120Mileage(), mileage));
    }

    /***
     * 超转速信息
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcSrInfo(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setSrNumber(row.getAs("sr_number"));
        basicDataDto.setSrDuration(row.getAs("sr_duration"));
        basicDataDto.setSrMileage(row.getAs("sr_mileage"));
        basicDataDto.setSrFuel(row.getAs("sr_fuel"));
        basicDataDto.setSr100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getSrNumber(), mileage));
        basicDataDto.setSrDurationProportion(DataUtil.durationProportion(basicDataDto.getSrDuration(), tripDuration));
        basicDataDto.setSrMileageProportion(DataUtil.mileageProportion(basicDataDto.getSrMileage(), mileage));
    }

    /***
     * 低转速（脱档)
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcLrog(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setLrogNumber(row.getAs("lrog_number"));
        basicDataDto.setLrogDuration(row.getAs("lrog_duration"));
        basicDataDto.setLrogMileage(row.getAs("lrog_mileage"));
        basicDataDto.setLrogFuel(row.getAs("lrog_fuel"));
        basicDataDto.setLrog100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getLrogNumber(), mileage));
        basicDataDto.setLrogDurationProportion(DataUtil.durationProportion(basicDataDto.getLrogDuration(), tripDuration));
        basicDataDto.setLrogMileageProportion(DataUtil.mileageProportion(basicDataDto.getLrogMileage(), mileage));
    }

    /***
     * 高速刹车信息
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcHsbInfo(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setHsbNumber(row.getAs("hsb_number"));
        basicDataDto.setHsbDuration(row.getAs("hsb_duration"));
        basicDataDto.setHsbMileage(row.getAs("hsb_mileage"));
        basicDataDto.setHsb100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getHsbNumber(), mileage));
        basicDataDto.setHsbDurationProportion(DataUtil.durationProportion(basicDataDto.getHsbDuration(), tripDuration));
        basicDataDto.setHsbMileageProportion(DataUtil.mileageProportion(basicDataDto.getHsbMileage(), mileage));
    }

    /***
     * 普通刹车信息
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcCsbInfo(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setCsbNumber(row.getAs("csb_number"));
        basicDataDto.setCsbDuration(row.getAs("csb_duration"));
        basicDataDto.setCsbMileage(row.getAs("csb_mileage"));
        basicDataDto.setCsb100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getCsbNumber(), mileage));
        basicDataDto.setCsbDurationProportion(DataUtil.durationProportion(basicDataDto.getCsbDuration(), tripDuration));
        basicDataDto.setCsbMileageProportion(DataUtil.mileageProportion(basicDataDto.getCsbMileage(), mileage));
    }

    /***
     * 离合相关信息
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcClutchInfo(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setClutchNumber(row.getAs("clutch_number"));
        basicDataDto.setClutchDuration(row.getAs("clutch_duration"));
        basicDataDto.setClutchMileage(row.getAs("clutch_mileage"));
        basicDataDto.setClutch100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getClutchNumber(), mileage));
        basicDataDto.setClutchDurationProportion(DataUtil.durationProportion(basicDataDto.getClutchDuration(), tripDuration));
        basicDataDto.setClutchMileageProportion(DataUtil.mileageProportion(basicDataDto.getClutchMileage(), mileage));
    }

    /***
     * 空挡滑行信息
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcNgCoastInfo(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setNgCoastNumber(row.getAs("ng_coast_number"));
        basicDataDto.setNgCoastMileage(row.getAs("ng_coast_mileage"));
        basicDataDto.setNgCoastDuration(row.getAs("ng_coast_duration"));
        basicDataDto.setNgCoastFuel(row.getAs("ng_coast_fuel"));
        basicDataDto.setNg100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getNgCoastNumber(), mileage));
        basicDataDto.setNgDurationProportion(DataUtil.durationProportion(basicDataDto.getNgCoastDuration(), tripDuration));
        basicDataDto.setNgMileageProportion(DataUtil.mileageProportion(basicDataDto.getNgCoastMileage(), mileage));
    }

    /***
     * 怠速相关信息
     * @param row
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcIdleInfo(Row row, AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setIdleFuel(row.getAs("idle_fuel"));
        basicDataDto.setIdleDuration(row.getAs("idle_duration"));
        basicDataDto.setIdleNumber(row.getAs("idle_number"));
        basicDataDto.setIdle100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getIdleNumber(), mileage));
        basicDataDto.setIdleDurationProportion(DataUtil.durationProportion(basicDataDto.getIdleDuration(), tripDuration));
    }

    /***
     * 熄火信息及每个小时车辆的运行状态
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcFout(AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        basicDataDto.setFoutTimes(basicDataDto.getFoutTimes());
        basicDataDto.setFoutDuration(basicDataDto.getFoutDuration());
        basicDataDto.setFout100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getFoutTimes(), mileage));
        basicDataDto.setFoutDurationProportion(DataUtil.durationProportion(basicDataDto.getFoutDuration(), tripDuration));
    }

    /**
     * 计算吨/公里
     */
    protected void calcTonKM(Row row, AbstractBasicDataDto basicDataDto) {
        WrappedArray.ofRef<Integer> mileage;
        WrappedArray.ofRef<Integer> load;

        try {
            mileage = row.getAs("trip_mileage_list");
            load = row.getAs("trip_load_list");
        }catch (UnsupportedOperationException|IllegalArgumentException e){
            LOGGER.error("计算计算吨/公里失败......", e);
            return;
        }

        int loadSize = load.size();
        List<TonKMDto> tonKMDtos = new ArrayList<>();
        //过滤掉一天的行程数大于50
        for(int i=0; i<mileage.size() && i<50; i++){
            //当载重的为null时，赋值为0
            tonKMDtos.add(new TonKMDto(mileage.apply(i), i<loadSize ? load.apply(i):  0 ));
        }

        basicDataDto.setTonKMDtos(tonKMDtos);
    }

    /**
     * 计算经过城市的详情信息
     */
    protected void calcCrossCitiesInfo(Row row, AbstractBasicDataDto basicDataDto) {
        WrappedArray.ofRef<String> cross_cities_list;
        try {
            cross_cities_list = row.getAs("cross_cities_list");
        }catch (UnsupportedOperationException|IllegalArgumentException e){
            LOGGER.error("计算经过城市的详情信息失败......", e);
            return;
        }

        List<InterCrossCity> unionList = new ArrayList();
        String[] cityInfos = cross_cities_list.array();
        for(int i=0; i<cityInfos.length; i++){
            try {
                unionList.addAll(JsonUtil.toList(cityInfos[i], InterCrossCity.class));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        List crossCities = new ArrayList();
        //跨城市去重：AAAABBBAABA -> ABABA
        //过滤掉一天的行程数大于50
        for(int i=0; i<unionList.size() && i<50 ; i++){
            InterCrossCity crossCity = unionList.get(i);
            if(i==0 || crossCity.getLcid()!=unionList.get(i-1).getLcid()){
                crossCities.add(crossCity);
            }
        }

        basicDataDto.setCrossCitiesInfos(crossCities);
    }

    /**
     * 计算满半空状态下的里程和油耗
     * @param row
     * @param basicDataDto
     */
    protected void calcWloadTypeInfo(Row row, AbstractBasicDataDto basicDataDto) {
        WrappedArray.ofRef<Integer> mileage;
        WrappedArray.ofRef<Integer> fuel;
        WrappedArray.ofRef<Integer> wloadType;

        try{
            mileage = row.getAs("trip_mileage_list");
            fuel = row.getAs("trip_fuel_list");
            wloadType = row.getAs("wload_type_list");
        }catch (UnsupportedOperationException|IllegalArgumentException e){
//            LOGGER.error("计算满半空状态下的里程和油耗......", e);
            return;
        }

        WLoadInfoDto wLoadInfoDto = new WLoadInfoDto();
        Map<String, WLoadInfoDto.WLoadInfo> wLoadInfoMap = wLoadInfoDto.getWLoadInfoMap();
        Integer[] wloadTypeArr = wloadType.array();

        Function<WLoadInfoDto.WLoadInfo, BiFunction<String, WLoadInfoDto.WLoadInfo, WLoadInfoDto.WLoadInfo>> funtion = wLoadInfo1 -> (key, loadInfo) -> {
            return null == loadInfo ? wLoadInfo1 : new WLoadInfoDto.WLoadInfo(wLoadInfo1.getMileage() + loadInfo.getMileage(), wLoadInfo1.getFuel() + loadInfo.getFuel(), wLoadInfo1.getCount() + loadInfo.getCount());
        };

        for(int i=0; i<wloadTypeArr.length; i++){
            WLoadInfoDto.WLoadInfo wLoadInfo = new WLoadInfoDto.WLoadInfo(mileage.apply(i),fuel.apply(i),1);
            switch (wloadTypeArr[i].intValue()){
                case -1:
                    wLoadInfoMap.compute("typeu", funtion.apply(wLoadInfo));
                    break;
                case 0:
                    wLoadInfoMap.compute("type0", funtion.apply(wLoadInfo));
                    break;
                case 1:
                    wLoadInfoMap.compute("type1", funtion.apply(wLoadInfo));
                    break;
                case 2:
                    wLoadInfoMap.compute("type2", funtion.apply(wLoadInfo));
                    break;
                case 3:
                    wLoadInfoMap.compute("type3", funtion.apply(wLoadInfo));
                    break;
                default:
                    break;
            }
        }

        basicDataDto.setWLoadInfoDto(wLoadInfoDto);
    }

    /***
     * 熄火信息及每个小时车辆的运行状态
     * @param basicDataDto
     * @param mileage
     * @param tripDuration
     */
    protected void calcFoutAndPerHourState(AbstractBasicDataDto basicDataDto, Long mileage, Long tripDuration) {
        String timeRanges = basicDataDto.getTimeRanges();
        if(timeRanges != null){
            BitSet bitset = new BitSet(24);
            List<Integer> tripTimes = new ArrayList<>();
            Long foutDuration = 0L;
            Long foutTimes = 0L;
            String[] timeRangeArray = timeRanges.split(",");
            for(String timeRange : timeRangeArray){
                String start = timeRange.split("_")[0];
                String end = timeRange.split("_")[1];
                int startSec = Integer.parseInt(start);
                int endSec = Integer.parseInt(end);
                tripTimes.addAll(Arrays.asList(startSec, endSec));
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(startSec * 1000);
                int startHour = calendar.get(Calendar.HOUR_OF_DAY);
                calendar.setTimeInMillis(endSec * 1000);
                int endHour = calendar.get(Calendar.HOUR_OF_DAY);
                for(int s = startHour; s <= endHour; s++){
                    bitset.set(s);
                }
                foutDuration += (endSec - startSec);
            }

            int minSec = Collections.min(tripTimes);
            int maxSec = Collections.max(tripTimes);
            int dayStart = (int)(new DateTime().withTimeAtStartOfDay().getMillis()/1000);
            int dayEnd = (int)((new DateTime().plusDays(1).withTimeAtStartOfDay().getMillis() - 1)/1000);
            if(minSec == dayStart){
                foutTimes++;
            }
            if(maxSec == dayEnd){
                foutTimes++;
            }
            foutTimes += timeRangeArray.length;

            //熄火统计
            basicDataDto.setFoutTimes(foutTimes);
            basicDataDto.setFoutDuration(86400 - foutDuration);
            basicDataDto.setFout100kmTimes(DataUtil.hundredKmTimes(basicDataDto.getFoutTimes(), mileage));
            basicDataDto.setFoutDurationProportion(DataUtil.durationProportion(basicDataDto.getFoutDuration(), tripDuration));
        }
    }

    //#############一汽，东风 由于转速区间一致，所以将方法提到默认实现类中，青汽则在自己的实例中覆盖方法实现
    protected List<StructField> getRpmSchema(){
        List<StructField> list = new ArrayList<>();
        list.add(new StructField("rpm_range500_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range500_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range500_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range600_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range600_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range600_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range700_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range700_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range700_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range800_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range800_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range800_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range900_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range900_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range900_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1000_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1000_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1000_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1100_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1100_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1200_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1200_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1200_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1300_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1300_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1300_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1400_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1400_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1400_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1500_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1500_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1500_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1600_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1600_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1600_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1700_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1700_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1700_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1800_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1800_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1800_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1900_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1900_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range1900_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2000_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2000_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2000_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2100_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2100_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2100_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2200_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2200_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2200_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2300_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2300_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2300_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2400_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2400_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2400_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2500_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2500_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2500_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2600_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2600_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2600_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2700_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2700_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2700_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2800_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2800_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2800_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2900_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2900_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range2900_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range3000_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range3000_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range3000_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range_over3000_mileage", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range_over3000_duration", DataTypes.IntegerType, true, Metadata.empty()));
        list.add(new StructField("rpm_range_over3000_fuel", DataTypes.IntegerType, true, Metadata.empty()));
        return list;
    }

    protected List<Object> getRpmValues(AbstractBasicDataDto basicDataDto){
        List<Object> list = new ArrayList<>();
        list.add(getIntValue(basicDataDto.getRpmRange500Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange500Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange500Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange600Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange600Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange600Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange700Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange700Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange700Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange800Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange800Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange800Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange900Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange900Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange900Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1000Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1000Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1000Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1100Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1100Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1100Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1200Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1200Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1200Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1300Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1300Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1300Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1400Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1400Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1400Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1500Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1500Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1500Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1600Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1600Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1600Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1700Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1700Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1700Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1800Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1800Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1800Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange1900Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange1900Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange1900Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2000Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2000Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2000Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2100Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2100Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2100Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2200Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2200Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2200Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2300Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2300Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2300Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2400Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2400Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2400Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2500Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2500Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2500Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2600Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2600Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2600Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2700Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2700Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2700Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2800Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2800Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2800Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange2900Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange2900Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange2900Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRange3000Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRange3000Duration()));
        list.add(getIntValue(basicDataDto.getRpmRange3000Fuel()));
        list.add(getIntValue(basicDataDto.getRpmRangeOver3000Mileage()));
        list.add(getIntValue(basicDataDto.getRpmRangeOver3000Duration()));
        list.add(getIntValue(basicDataDto.getRpmRangeOver3000Fuel()));
        return list;
    }

    protected void setRpmRangeInfo(Row row, AbstractBasicDataDto basicDataDto){
        basicDataDto.setRpmRange500Mileage(row.getAs("rpm_range500_mileage"));
        basicDataDto.setRpmRange500Duration(row.getAs("rpm_range500_duration"));
        basicDataDto.setRpmRange500Fuel(row.getAs("rpm_range500_fuel"));
        basicDataDto.setRpmRange600Mileage(row.getAs("rpm_range600_mileage"));
        basicDataDto.setRpmRange600Duration(row.getAs("rpm_range600_duration"));
        basicDataDto.setRpmRange600Fuel(row.getAs("rpm_range600_fuel"));
        basicDataDto.setRpmRange700Mileage(row.getAs("rpm_range700_mileage"));
        basicDataDto.setRpmRange700Duration(row.getAs("rpm_range700_duration"));
        basicDataDto.setRpmRange700Fuel(row.getAs("rpm_range700_fuel"));
        basicDataDto.setRpmRange800Mileage(row.getAs("rpm_range800_mileage"));
        basicDataDto.setRpmRange800Duration(row.getAs("rpm_range800_duration"));
        basicDataDto.setRpmRange800Fuel(row.getAs("rpm_range800_fuel"));
        basicDataDto.setRpmRange900Mileage(row.getAs("rpm_range900_mileage"));
        basicDataDto.setRpmRange900Duration(row.getAs("rpm_range900_duration"));
        basicDataDto.setRpmRange900Fuel(row.getAs("rpm_range900_fuel"));
        basicDataDto.setRpmRange1000Mileage(row.getAs("rpm_range1000_mileage"));
        basicDataDto.setRpmRange1000Duration(row.getAs("rpm_range1000_duration"));
        basicDataDto.setRpmRange1000Fuel(row.getAs("rpm_range1000_fuel"));
        basicDataDto.setRpmRange1100Mileage(row.getAs("rpm_range1100_mileage"));
        basicDataDto.setRpmRange1100Duration(row.getAs("rpm_range1100_duration"));
        basicDataDto.setRpmRange1100Fuel(row.getAs("rpm_range1100_fuel"));
        basicDataDto.setRpmRange1200Mileage(row.getAs("rpm_range1200_mileage"));
        basicDataDto.setRpmRange1200Duration(row.getAs("rpm_range1200_duration"));
        basicDataDto.setRpmRange1200Fuel(row.getAs("rpm_range1200_fuel"));
        basicDataDto.setRpmRange1300Mileage(row.getAs("rpm_range1300_mileage"));
        basicDataDto.setRpmRange1300Duration(row.getAs("rpm_range1300_duration"));
        basicDataDto.setRpmRange1300Fuel(row.getAs("rpm_range1300_fuel"));
        basicDataDto.setRpmRange1400Mileage(row.getAs("rpm_range1400_mileage"));
        basicDataDto.setRpmRange1400Duration(row.getAs("rpm_range1400_duration"));
        basicDataDto.setRpmRange1400Fuel(row.getAs("rpm_range1400_fuel"));
        basicDataDto.setRpmRange1500Mileage(row.getAs("rpm_range1500_mileage"));
        basicDataDto.setRpmRange1500Duration(row.getAs("rpm_range1500_duration"));
        basicDataDto.setRpmRange1500Fuel(row.getAs("rpm_range1500_fuel"));
        basicDataDto.setRpmRange1600Mileage(row.getAs("rpm_range1600_mileage"));
        basicDataDto.setRpmRange1600Duration(row.getAs("rpm_range1600_duration"));
        basicDataDto.setRpmRange1600Fuel(row.getAs("rpm_range1600_fuel"));
        basicDataDto.setRpmRange1700Mileage(row.getAs("rpm_range1700_mileage"));
        basicDataDto.setRpmRange1700Duration(row.getAs("rpm_range1700_duration"));
        basicDataDto.setRpmRange1700Fuel(row.getAs("rpm_range1700_fuel"));
        basicDataDto.setRpmRange1800Mileage(row.getAs("rpm_range1800_mileage"));
        basicDataDto.setRpmRange1800Duration(row.getAs("rpm_range1800_duration"));
        basicDataDto.setRpmRange1800Fuel(row.getAs("rpm_range1800_fuel"));
        basicDataDto.setRpmRange1900Mileage(row.getAs("rpm_range1900_mileage"));
        basicDataDto.setRpmRange1900Duration(row.getAs("rpm_range1900_duration"));
        basicDataDto.setRpmRange1900Fuel(row.getAs("rpm_range1900_fuel"));
        basicDataDto.setRpmRange2000Mileage(row.getAs("rpm_range2000_mileage"));
        basicDataDto.setRpmRange2000Duration(row.getAs("rpm_range2000_duration"));
        basicDataDto.setRpmRange2000Fuel(row.getAs("rpm_range2000_fuel"));
        basicDataDto.setRpmRange2100Mileage(row.getAs("rpm_range2100_mileage"));
        basicDataDto.setRpmRange2100Duration(row.getAs("rpm_range2100_duration"));
        basicDataDto.setRpmRange2100Fuel(row.getAs("rpm_range2100_fuel"));
        basicDataDto.setRpmRange2200Mileage(row.getAs("rpm_range2200_mileage"));
        basicDataDto.setRpmRange2200Duration(row.getAs("rpm_range2200_duration"));
        basicDataDto.setRpmRange2200Fuel(row.getAs("rpm_range2200_fuel"));
        basicDataDto.setRpmRange2300Mileage(row.getAs("rpm_range2300_mileage"));
        basicDataDto.setRpmRange2300Duration(row.getAs("rpm_range2300_duration"));
        basicDataDto.setRpmRange2300Fuel(row.getAs("rpm_range2300_fuel"));
        basicDataDto.setRpmRange2400Mileage(row.getAs("rpm_range2400_mileage"));
        basicDataDto.setRpmRange2400Duration(row.getAs("rpm_range2400_duration"));
        basicDataDto.setRpmRange2400Fuel(row.getAs("rpm_range2400_fuel"));
        basicDataDto.setRpmRange2500Mileage(row.getAs("rpm_range2500_mileage"));
        basicDataDto.setRpmRange2500Duration(row.getAs("rpm_range2500_duration"));
        basicDataDto.setRpmRange2500Fuel(row.getAs("rpm_range2500_fuel"));
        basicDataDto.setRpmRange2600Mileage(row.getAs("rpm_range2600_mileage"));
        basicDataDto.setRpmRange2600Duration(row.getAs("rpm_range2600_duration"));
        basicDataDto.setRpmRange2600Fuel(row.getAs("rpm_range2600_fuel"));
        basicDataDto.setRpmRange2700Mileage(row.getAs("rpm_range2700_mileage"));
        basicDataDto.setRpmRange2700Duration(row.getAs("rpm_range2700_duration"));
        basicDataDto.setRpmRange2700Fuel(row.getAs("rpm_range2700_fuel"));
        basicDataDto.setRpmRange2800Mileage(row.getAs("rpm_range2800_mileage"));
        basicDataDto.setRpmRange2800Duration(row.getAs("rpm_range2800_duration"));
        basicDataDto.setRpmRange2800Fuel(row.getAs("rpm_range2800_fuel"));
        basicDataDto.setRpmRange2900Mileage(row.getAs("rpm_range2900_mileage"));
        basicDataDto.setRpmRange2900Duration(row.getAs("rpm_range2900_duration"));
        basicDataDto.setRpmRange2900Fuel(row.getAs("rpm_range2900_fuel"));
        basicDataDto.setRpmRange3000Mileage(row.getAs("rpm_range3000_mileage"));
        basicDataDto.setRpmRange3000Duration(row.getAs("rpm_range3000_duration"));
        basicDataDto.setRpmRange3000Fuel(row.getAs("rpm_range3000_fuel"));
        basicDataDto.setRpmRangeOver3000Mileage(row.getAs("rpm_range_over3000_mileage"));
        basicDataDto.setRpmRangeOver3000Duration(row.getAs("rpm_range_over3000_duration"));
        basicDataDto.setRpmRangeOver3000Fuel(row.getAs("rpm_range_over3000_fuel"));
        basicDataDto.setNoIdleRpmSum(row.getAs("no_idle_rpm_sum"));
        basicDataDto.setNoIdleRpmCount(row.getAs("no_idle_rpm_count"));
        basicDataDto.setRpmSum(row.getAs("rpm_sum"));
        basicDataDto.setRpmCount(row.getAs("rpm_count"));
        basicDataDto.setMaxRpm(row.getAs("max_rpm"));
        basicDataDto.setMinRpm(row.getAs("min_rpm"));
        basicDataDto.setAvgRpm(DataUtil.remainTwoBit(basicDataDto.getRpmSum(), basicDataDto.getRpmCount()));
        basicDataDto.setAvgNoIdleRpm(DataUtil.remainTwoBit(basicDataDto.getNoIdleRpmSum(), basicDataDto.getNoIdleRpmCount()));
    }
}
